//C15.14:sales.h -- exception and ineritance
#include <stdexcept>
#include <string>

class Sales
{
    public:
        enum { MONTHS = 12 };    // could be a static const
        class bad_index : public std::logic_error
        {
            int bi;    // bad index value
            public:
                explicit bad_index(int ix,
                        const std::string & s = "Index error in Sales object\n");
            int bi_val() const { return bi; };           
            virtual ~bad_index() throw() {}
        };
        explicit Sales(int yy = 0);
        Sales(int yy, const double * gr, int n);
        virtual ~Sales(){}
        int Year() const { return year; }
        virtual double operator[](int i) const;
        virtual double & operator[](int i);
    private:    
        double gross[MONTHS];
        int year;
};

class LabeledSales : public Sales
{
    public:
        class nbad_index : public Sales::bad_index
        {
            std::string lbl;
            public:
                nbad_index(const std::string & lb, int ix,
                        const std::string & s = "Index error in LabeledSales object\n");
                const std::string & label_val() const { return lbl; };
                virtual ~nbad_index() throw() {}
        };
        explicit LabeledSales(const std::string & lb = "none", int yy = 0);
        LabeledSales(const std::string & lb, int yy, const double * gr, int n);
        virtual ~LabeledSales(){}
        const std::string & Label() const { return label; }
        virtual double operator[](int i) const;
        virtual double & operator[](int i);

        std::string label;
};
